package com.ry.bhwktapp.home.ui
/**
 * kotlin演示内联函数的使用
 */
fun main() {
    //lambda 函数属于函数类型的对象
//    loginAPI(USER_NAME, USER_PWD){ msg:String,code:Int ->
//        println("最终登录情况如下 $msg 状态码 $code")
//    }

    //lambda 函数属于函数类型的对象 ，而resultLoginMethod只是一个普通的函数，需要转成函数型对象，使用：：
    //这样的写法更简单了（::可以调用一个函数作为参数）
    loginAPI(USER_NAME, USER_PWD,::resultLoginMethod)

    //还可以这样写
//    val obj =  ::resultLoginMethod
//    val obj1 = obj
//    loginAPI(USER_NAME, USER_PWD,obj)

}


//实现了lambda函数（resultLogin:(String,Int) -> Unit） 其实相当于把之前那种写法拆开了
fun resultLoginMethod(msg:String,code:Int){
    println("最终登录情况如下 $msg 状态码 $code")
}

//使用内联函数（在修饰符后加上inline）的优势，减少对象生成，优化内存(相当于直接把引用的代码拿过来使用) 没有任何函数开辟、对象开辟的损耗
//使用内联函数(inline)
//总结：如果参数有lambda 尽量使用 inline关键字修饰，这样内部会优化，减少内存开销
private inline fun loginAPI(username:String,userPwd:String,resultLogin:(String,Int) -> Unit){
    if (username==null||userPwd==null) {
        TODO("用户名或密码为null")
    }

    if (username.length>4&&userPwd.length>4) {
        if(webAPI(username,userPwd)){
            resultLogin("登录成功",200)
        }else{
            resultLogin("登录失败",400)
        }
    }else{
        TODO("用户名或密码非法！")
    }

}


//模拟服务器返回 （这种没有使用lambda所以不用使用内联函数）
private fun webAPI(username:String,userPwd:String):Boolean{
    return username=="旺旺旺旺旺旺"&&userPwd=="123456"
}